mod code;

use proc_macro::TokenStream;

// 派生式过程宏, 可以理解为是一种特殊的属性式过程宏
// 名字是由这个宏的第一个参数决定, 但是这个宏的参数是可以添加 attributes 的
// 函数的参数只有一个, 就是他所修饰的代码
// 过程宏的标识符是不会被计入 DeriveInput 的, 他的其他的宏(该宏之下的宏)会被计入 DeriveInput.attrs 中
// 可见性在 DeriveInput.vis, 名字在 DeriveInput.ident, 泛型在 DeriveInput.generics, body 在 DeriveInput.data
#[proc_macro_derive(Validator, attributes(validate))]
pub fn derive_validator(input: TokenStream) -> TokenStream {
    let input = syn::parse_macro_input!(input as syn::DeriveInput);
    match code::DeriveValidator::new(input).generate() {
        Ok(tokens) => tokens.into(),
        Err(err) => err.to_compile_error().into(), // to_compile_error 结果是 syn::TokenStream
    }
}
